﻿//TraderWindow.xaml.cs
//Copyright (c) 2013 StockSharp LLC, all rights reserved.
//This code module is part of StockSharp library.
//This code is licensed under the GNU GENERAL PUBLIC LICENSE Version 3.
//See the file License.txt for the license details.
//More info on: http://stocksharp.com

namespace StockSharp.Xaml
{
	using System;
	using System.Windows;

	using Ecng.Common;
	using Ecng.Xaml;

	using StockSharp.BusinessEntities;

	/// <summary>
	/// Окно редактирования настроек шлюза <see cref="ITrader"/>.
	/// </summary>
	public partial class TraderWindow
	{
		/// <summary>
		/// Создать <see cref="TraderWindow"/>.
		/// </summary>
		public TraderWindow()
		{
			InitializeComponent();
		}

		/// <summary>
		/// Визуальная панель настроек шлюза.
		/// </summary>
		public ITraderSettingsPanel SettingsPanel
		{
			get { return (ITraderSettingsPanel)SettingsContent.Content; }
			set
			{
				SettingsContent.Content = value;
			}
		}

		private ITrader _trader;

		/// <summary>
		/// Шлюз к торговой системе.
		/// </summary>
		public ITrader Trader
		{
			get { return _trader; }
			set
			{
				if (value == null)
					throw new ArgumentNullException("value");

				SettingsPanel.Load(value);
				_trader = value;
			}
		}

		private void Test_Click(object sender, RoutedEventArgs e)
		{
			if (!SettingsPanel.IsValid)
			{
				new MessageBoxBuilder()
					.Text("Невозможно протестировать подключение так как не были заполнены все данные.")
					.Owner(this)
					.Error()
						.Show();
				
				return;
			}

			Test.IsEnabled = false;

			var trader = CreateTrader();

			trader.Connected += () =>
			{
				trader.Dispose();

				GuiDispatcher.GlobalDispatcher.AddSyncAction(() =>
				{
					new MessageBoxBuilder()
						.Text("Соединение успешно проверено.")
						.Owner(this)
							.Show();

					Test.IsEnabled = true;
				});
			};

			trader.ConnectionError += error =>
			{
				trader.Dispose();

				GuiDispatcher.GlobalDispatcher.AddSyncAction(() =>
				{
					new MessageBoxBuilder()
						.Text("Невозможно установить соединение." + Environment.NewLine + error)
						.Error()
						.Owner(this)
							.Show();

					Test.IsEnabled = true;
				});
			};

			trader.Connect();
		}

		private void OkBtn_Click(object sender, RoutedEventArgs e)
		{
			if (!SettingsPanel.IsValid)
			{
				new MessageBoxBuilder()
					.Text("Невозможно создать подключение так как не были заполнены все данные.")
					.Owner(this)
					.Error()
						.Show();

				return;
			}

			SettingsPanel.Save(Trader);
			DialogResult = true;
		}

		private ITrader CreateTrader()
		{
			var trader = Trader.GetType().CreateInstance<ITrader>();
			SettingsPanel.Save(trader);
			return trader;
		}
	}
}